package com.example.ticketingserver.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.ticketingserver.dto.R;
import com.example.ticketingserver.entity.Admin;
import com.example.ticketingserver.entity.Ordertext;
import com.example.ticketingserver.service.AdminService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

import static com.baomidou.mybatisplus.extension.toolkit.Db.getOne;
import static com.baomidou.mybatisplus.extension.toolkit.Db.save;

@CrossOrigin //开启不同源的访问，允许来自任何源的访问。
@Tag(name = "管理员接口",description = "管理员相关功能接口，包含：登录，添加，修改，删除。")
@RestController
public class AdminController {
    @Autowired
    private AdminService adminService;

    @Operation(summary = "管理员登录",description = "需要提供管理员账号和密码")
    @Parameters({
            @Parameter(name = "username",description = "管理员账号"),
            @Parameter(name = "password",description = "管理员密码")
    })
    @GetMapping("/admin/login")
    public R login(Admin admin){
            //获取查询条件构造器
            QueryWrapper<Admin> query = Wrappers.query(Admin.class);
            query.eq("username",admin.getUsername());
            //执行查询
            Admin one = getOne(query);
            if(Objects.isNull(one)){
                return R.fail().setMsg("账号不存在");
            }
            if (one.getStatus() !=0){
                return R.fail().setMsg("账号禁用").setCode(1);
            }
//        获取数据库中储存的随即盐组合输入密码加密
            String pwd = SecureUtil.md5(admin.getPassword() + one.getSalt());
            admin.setPassword(pwd);
            if (Objects.equals(one.getPassword(),admin.getPassword())){
                return R.ok().setMsg("登录成功").setData(one);
            }
            return R.fail().setMsg("密码错误！！！").setCode(2);
        }
    @Operation(summary = "管理员添加",description = "需要提供管理员账号和密码")
    @PostMapping("/admin/reg")
    public R add(@Parameter(description = "管理员对象") @RequestBody Admin admin){
//获取查询条件构造器
        QueryWrapper<Admin> query = Wrappers.query(Admin.class);
        query.eq("username",admin.getUsername());
        //执行查询
        Admin one = getOne(query);
        if(Objects.nonNull(one)){
            return R.fail().setMsg("账号已存在！");
        }
//        生产一个随机盐
        String salt = RandomUtil.randomString(6);
//        将随机盐和用户输入的密码组合加密
        String pwd = SecureUtil.md5(admin.getPassword() + salt);
//        将盐和加密后的密码添加到对象中
        admin.setSalt(salt);
        admin.setPassword(pwd);
        if(save(admin)){
            return R.ok().setMsg("添加成功！").setData(admin);
        }
        return R.fail().setMsg("添加失败！");
    }
    @Operation(summary = "管理员更新",description = "根据管理员id更改密码或状态")
    @PutMapping("/admin/update")
    public R modify(@Parameter(description = "管理员对象") @RequestBody Admin admin){
        if (Objects.nonNull(admin.getPassword())){
            //        生产一个随机盐
            String salt = RandomUtil.randomString(6);
//        将随机盐和用户输入的密码组合加密
            String pwd = SecureUtil.md5(admin.getPassword() + salt);
//        将盐和加密后的密码添加到对象中
            admin.setSalt(salt);
            admin.setPassword(pwd);
        }
//        根据id修改管理员信息(务必传入管理员id)
        boolean b = adminService.updateById(admin);
        return b ? R.ok().setMsg("修改成功！").setData(admin) : R.fail().setMsg("修改失败！");
    }
    @Operation(summary = "管理员删除",description = "根据管理员id删除")
    @DeleteMapping("/admin/del/{id}")
    public R delById(@Parameter(description = "管理员对象") @PathVariable("id") Integer id){
        Admin admin = adminService.getById(id);
        if(Objects.isNull(admin)){
            return R.fail().setMsg("该管理员不存在！");
        }
        return adminService.removeById(id) ? R.ok().setMsg("删除成功！").setData(admin) : R.fail().setMsg("删除失败！");

    }

    /**
     * 分页查询
     * @param page
     * @param limit
     * @return
     */
    @Operation(summary = "管理员列表",description = "显示所有管理员信息，含分页功能，需要提供当前页码（page），以及每页限制条数（limit）")
    @Parameters({
            @Parameter(name = "page",description = "当前页码",required = true),
            @Parameter(name = "limit",description = "每页的条数",required = true),
    })
    @GetMapping("/admin/list")
    public R list(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "5") Integer limit){
//        执行分页查询
        List<Admin> list = adminService.list(new Page<Admin>(page, limit));
        long count = adminService.count();
        return R.ok().setData(list).setCount(count);
    }
    @Operation(summary = "查询所有管理员",description = "所有管理员")
    @GetMapping("/admin/listAll")
    public R queryAll(){
        List<Admin> list = adminService.list();
        return R.ok().setMsg("查询成功").setData(list);
    }
}
